#include <iostream>
#include "Thread.hpp"
#include "LockGuard.hpp"
#include <unistd.h>
#include <vector>


int tickets = 1000;

void* route(Thread::ThreadData* td)
{
    while(tickets)
    {
        // pthread_mutex_lock(td->_lock); // 加锁
        LockGuard lg(td->_lock);
        if (tickets > 0)
        {
            // 抢票
            usleep(1000); // 模拟抢票过程，耗时1ms
            printf("who: %s, get a ticket: %d\n", td->_name.c_str(), tickets);
            tickets--;
            // pthread_mutex_unlock(td->_lock); // 解锁
        }
        else
        {
            // 结束抢票
            // pthread_mutex_unlock(td->_lock); // 解锁
            break;
        }
    }
    return nullptr;
}
// pthread_mutex_t gmutex = PTHREAD_MUTEX_INITIALIZER;
// void* route(const std::string& name)
// {
//     while(tickets)
//     {
//         pthread_mutex_lock(&gmutex); // 加锁
//         if (tickets > 0)
//         {
//             // 抢票
//             usleep(1000); // 模拟抢票过程，耗时1ms
//             printf("who: %s, get a ticket: %d\n", name.c_str(), tickets);
//             tickets--;
//             pthread_mutex_unlock(&gmutex); // 解锁
//         }
//         else
//         {
//             // 结束抢票
//             pthread_mutex_unlock(&gmutex); // 解锁
//             break;
//         }
//     }
//     return nullptr;
// }


int main()
{
    pthread_mutex_t mutex;
    pthread_mutex_init(&mutex, nullptr);

    std::vector<Thread::thread> threads;
    for(int i = 0; i < 4; i++)
    {
        std::string name = "thread-" + std::to_string(i+1);
        Thread::ThreadData *td = new Thread::ThreadData(name, &mutex);
        threads.emplace_back(name, route, td);
    }

    for(auto &thread : threads)
    {
        thread.Start();
    }


    for(auto &thread : threads)
    {
        thread.Join();
    }

    pthread_mutex_destroy(&mutex);
}

// int main()
// {
//     pthread_mutex_t mutex;
//     pthread_mutex_init(&mutex, nullptr);
//     Thread::thread t1("thread-1", route);
//     Thread::thread t2("thread-2", route);
//     Thread::thread t3("thread-3", route);
//     Thread::thread t4("thread-4", route);

//     t1.Start();
//     t2.Start();
//     t3.Start();
//     t4.Start();

//     t1.Join();
//     t2.Join();
//     t3.Join();
//     t4.Join();

//     pthread_mutex_destroy(&mutex);
// }
// void* threadrun(const std::string& name)
// {
//     // int cnt = 10;
//     int cnt = 1;
//     while(1)
//     {
//         std::cout << name << " is running, cnt: " << cnt << std::endl;
//         cnt++;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     // 创建线程对象
//     std::vector<Thread::thread> threads;
//     for (int i = 0; i < 10; i++)
//     {
//         std::string name = "thread-" + std::to_string(i+1);
//         threads.emplace_back(name, threadrun);
//         sleep(1);
//     }

//     // 统一开始
//     for(auto& thread : threads)
//         thread.Start();

//     sleep(3); // 运行3s

//     // 统一结束
//     for(auto& thread : threads)
//         thread.Stop();
        
//     // 统一等待
//     for(auto& thread : threads)
//     thread.Join();

//     return 0;
// }

// int main()
// {
//     // 创建线程对象
//     Thread::thread td1("thread-1", threadrun);

//     // 开始
//     td1.Start();
//     // 结束
//     td1.Stop();
//     // 等待
//     td1.Join();

//     sleep(2);
//     return 0;
// }